/**
 * @license
 * Copyright 2015 The Lovefield Project Authors. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
goog.setTestOnly();
goog.provide('lf.testing.perf.Benchmark');
goog.provide('lf.testing.perf.TestCase');

goog.require('goog.Promise');



/**
 * An interface to be implemented by all benchmarks.
 * @interface
 */
lf.testing.perf.Benchmark = function() {};


/** @return {!Array<!lf.testing.perf.TestCase>} */
lf.testing.perf.Benchmark.prototype.getTestCases;



/**
 * @constructor
 * @struct
 * @final
 *
 * @param {string} testName
 * @param {!function(): !IThenable} tester
 * @param {!function(!Array<!Object>): !IThenable<boolean>=} opt_validator
 * @param {boolean=} opt_skipRecording Whether time data for this test should be
 *     recorded.
 */
lf.testing.perf.TestCase = function(
    testName, tester, opt_validator, opt_skipRecording) {
  /** @type {string} */
  this.name = testName;

  /** @type {!function(): !IThenable} */
  this.tester = tester;

  /** @type {!function(!Array<!Object>): !IThenable<boolean>} */
  this.validator = opt_validator ||
      /** @return {!IThenable<boolean>} */
      function() { return goog.Promise.resolve(true); };

  /** @type {boolean} */
  this.skipRecording = opt_skipRecording || false;
};
